#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>



int main(int argc, char* argv[])
{
	if(argc < 3)
	{
		printf("Using:./procctl timetvl program argv ...\n");
		printf("Example:/project/tools1/bin/procctl 5 /usr/bin/ls -lt /tmp\n\n");
		printf("本程序时服务程序的调度程序,周期性启动服务程序火shell脚本\n");
		printf("timetvl:运行周期,单位:秒.被调度的程序运行结束后,在timetvl秒后会被procctl重新启动\n");
		printf("program:被调度的程序名,必须使用全路径\n");
		printf("argvs:被调度的程序的参数\n");
		printf("注意:本程序不会被kill杀死,但是可以用kill -9强行杀死 \n\n");
		return -1;
	}

	for(int i = 0; i < 64; ++i)
	{
		//关闭所有信号
		signal(i,SIG_IGN);
		//关闭所有文件,包括标准输入输出文件
		//close(i);
	}
	
	//生成子进程,父进程退出,让程序运行在后台,由1号系统托管,必须启用子进程退出信号
	if(fork()!=0) exit(0);

	//启用子进程退出信号,让父进程可以wait子进程退出的状态
	signal(SIGCHLD,SIG_DFL);
	
	char* pargv[argc];
	for(int i = 2; i < argc; ++i)
	{
		pargv[i-2] = argv[i];
	}
	pargv[argc-2] = NULL;

	//int count = 1;
	//execl("/usr/bin/ls","ls","-a","/tmp",(char*)0);
	while(true)
	{
		//由于父进程退出此处实际是由子进程fork产生一个新的子进程
		int ret = fork();
		if(0 == ret)//子进程
		{
			//execv();
			//printf("process %d begin\n",count);
			//execl("/usr/bin/ls","ls","-a","/tmp",(char*)0);
			execv(argv[2],pargv);
			exit(0);//如果execv()执行失败会执行此行,防止僵尸进程
		}
		else if(0 < ret)
		{
			//printf("main process begin\n");
			int status;
			wait(&status);
			//++count;
			sleep(atoi(argv[1]));
		}
		else
		{
			perror("execl failed");
		}
	}
	return 0;
}
